﻿// Decompiled with JetBrains decompiler
// Type: TaleWorlds.MountAndBlade.ComponentInterfaces.AgentApplyDamageModel
// Assembly: TaleWorlds.MountAndBlade, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// MVID: D5209D1B-76B5-47CA-B957-255CD4B2CE6B
// Assembly location: D:\steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.MountAndBlade.dll

using TaleWorlds.Core;

#nullable disable
namespace TaleWorlds.MountAndBlade.ComponentInterfaces
{
  public abstract class AgentApplyDamageModel : GameModel
  {
    public abstract float CalculateDamage(
      in AttackInformation attackInformation,
      in AttackCollisionData collisionData,
      in MissionWeapon weapon,
      float baseDamage);

    public abstract void DecideMissileWeaponFlags(
      Agent attackerAgent,
      MissionWeapon missileWeapon,
      ref WeaponFlags missileWeaponFlags);

    public abstract void CalculateDefendedBlowStunMultipliers(
      Agent attackerAgent,
      Agent defenderAgent,
      CombatCollisionResult collisionResult,
      WeaponComponentData attackerWeapon,
      WeaponComponentData defenderWeapon,
      out float attackerStunMultiplier,
      out float defenderStunMultiplier);

    public abstract float CalculateStaggerThresholdDamage(Agent defenderAgent, in Blow blow);

    public abstract float CalculateAlternativeAttackDamage(
      BasicCharacterObject attackerCharacter,
      WeaponComponentData weapon);

    public abstract float CalculatePassiveAttackDamage(
      BasicCharacterObject attackerCharacter,
      in AttackCollisionData collisionData,
      float baseDamage);

    public abstract MeleeCollisionReaction DecidePassiveAttackCollisionReaction(
      Agent attacker,
      Agent defender,
      bool isFatalHit);

    public abstract float CalculateShieldDamage(
      in AttackInformation attackInformation,
      float baseDamage);

    public abstract float GetDamageMultiplierForBodyPart(
      BoneBodyPartType bodyPart,
      DamageTypes type,
      bool isHuman,
      bool isMissile);

    public abstract bool CanWeaponIgnoreFriendlyFireChecks(WeaponComponentData weapon);

    public abstract bool CanWeaponDismount(
      Agent attackerAgent,
      WeaponComponentData attackerWeapon,
      in Blow blow,
      in AttackCollisionData collisionData);

    public abstract bool CanWeaponKnockback(
      Agent attackerAgent,
      WeaponComponentData attackerWeapon,
      in Blow blow,
      in AttackCollisionData collisionData);

    public abstract bool CanWeaponKnockDown(
      Agent attackerAgent,
      Agent victimAgent,
      WeaponComponentData attackerWeapon,
      in Blow blow,
      in AttackCollisionData collisionData);

    public abstract bool DecideCrushedThrough(
      Agent attackerAgent,
      Agent defenderAgent,
      float totalAttackEnergy,
      Agent.UsageDirection attackDirection,
      StrikeType strikeType,
      WeaponComponentData defendItem,
      bool isPassiveUsageHit);

    public abstract bool DecideAgentShrugOffBlow(
      Agent victimAgent,
      AttackCollisionData collisionData,
      in Blow blow);

    public abstract bool DecideAgentDismountedByBlow(
      Agent attackerAgent,
      Agent victimAgent,
      in AttackCollisionData collisionData,
      WeaponComponentData attackerWeapon,
      in Blow blow);

    public abstract bool DecideAgentKnockedBackByBlow(
      Agent attackerAgent,
      Agent victimAgent,
      in AttackCollisionData collisionData,
      WeaponComponentData attackerWeapon,
      in Blow blow);

    public abstract bool DecideAgentKnockedDownByBlow(
      Agent attackerAgent,
      Agent victimAgent,
      in AttackCollisionData collisionData,
      WeaponComponentData attackerWeapon,
      in Blow blow);

    public abstract bool DecideMountRearedByBlow(
      Agent attackerAgent,
      Agent victimAgent,
      in AttackCollisionData collisionData,
      WeaponComponentData attackerWeapon,
      in Blow blow);

    public abstract float GetDismountPenetration(
      Agent attackerAgent,
      WeaponComponentData attackerWeapon,
      in Blow blow,
      in AttackCollisionData collisionData);

    public abstract float GetKnockBackPenetration(
      Agent attackerAgent,
      WeaponComponentData attackerWeapon,
      in Blow blow,
      in AttackCollisionData collisionData);

    public abstract float GetKnockDownPenetration(
      Agent attackerAgent,
      WeaponComponentData attackerWeapon,
      in Blow blow,
      in AttackCollisionData collisionData);

    public abstract float GetHorseChargePenetration();
  }
}
